import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created with IntelliJ IDEA.
 * Description:CAS
 * User: 邓大帅
 * Date: 2024-01-26
 * Time: 13:09

//CAS实际上是Java对一个cpu指令的封装，具有原子性 操作由cpu硬件支持，现在大部分cpu都有这一指令 compare and swap
//CAS可以用于实现很多操作 例：1.实现原子类 原子类：add之类的操作是原子的，线程安全 2.实现自旋锁
//CAS ”无锁编程“
//CAS aba问题：CAS这要是比较内存的值有没有改变 有时候一个变量的值会从a->b->a，这样CAS是发现不了这个变量是改变过的，这样的情况大部分时候都没事，但在有些场景下会出bug
//解决aba问题 可以规定变量的改变方向，不让其反复横跳，比如只可以自增或自减 也可以给变量设置版本号，一旦修改版本号就自增一次
*/
public class ThreadDemo2 {
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger num = new AtomicInteger(0);
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5000; i++) {
                num.incrementAndGet();
            }
        });
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5000; i++) {
                num.incrementAndGet();
            }
        });
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        System.out.println(num.get());
    }
}
